package cn.mdmbct.douyin.common.executor;

import cn.mdmbct.douyin.common.bean.AccessToken;
import cn.mdmbct.douyin.common.bean.RefreshToken;
import cn.mdmbct.douyin.common.enums.ApiPlatform;
import cn.mdmbct.douyin.common.exception.ApiCallException;
import cn.mdmbct.douyin.common.exception.LandExpirationException;

/**
 * @author mdmbct  mdmbct@outlook.com
 * @date 5/10/2021 21:54 AM
 * @modified mdmbct
 * @since 1.0
 */
public interface DyTokenManager {


    /**
     * 用open id获取AccessToken 如果AccessToken过期会尝试拿RefreshToken换取
     * 如果RefreshToken也过期的话 抛出{@link LandExpirationException}登录信息过期异常
     *
     * @param openId      open id
     * @param apiPlatform 授权api 平台 {@link ApiPlatform}
     * @param autoRenew   当AccessToken过期时 是否自动获取新的 如果为false时 且AccessToken过期 返回空
     * @return AccessToken {@link AccessToken}
     * @throws LandExpirationException 登陆信息过期异常
     *                                 当authRew = true时，且RefreshToken失效时抛出该异常
     */
    AccessToken getAccessToken(String openId, ApiPlatform apiPlatform, boolean autoRenew) throws LandExpirationException;

    /**
     * 使用refreshToken刷新AccessToken
     *
     * @param refreshToken 通过access_token获取到的refresh_token参数<p/>
     *                     （在<a href="https://open.douyin.com/platform/doc/6848806493387606024">抖音OpenAPI 帐号授权 获取access_token</a>）
     *                     返回的json中的“refresh_token”字段
     * @param apiPlatform  授权api 平台 {@link ApiPlatform}
     * @return 刷新后的accessToken
     * @throws ApiCallException 接口调用异常
     */
    AccessToken renewAccessToken(RefreshToken refreshToken, ApiPlatform apiPlatform) throws ApiCallException;


    /**
     * 用open id获取RefreshToken
     *
     * @param openId open id
     * @return RefreshToken {@link RefreshToken}
     * @throws LandExpirationException 登陆信息过期异常 获取不到RefreshToken时抛出该异常
     */
    RefreshToken getRefreshToken(String openId) throws LandExpirationException;

    /**
     * 使用旧refreshToken刷新refreshToken
     *
     * @param oldRefreshToken 旧refreshToken
     * @param openId          open id
     * @return 新的RefreshToken
     * @throws ApiCallException 接口调用异常
     */
    RefreshToken renewRefreshToken(RefreshToken oldRefreshToken, String openId) throws ApiCallException;


}
